#include "dif1c1.h"
     #define true 1
     #define false 0
     typedef unsigned char bool;


void DIF__vAltitudeCalculation(void)
{
	// 1. 读取输入信号
	uint16 canHeiLvl = SYN__u16HeiLvl(); // 0x0000~0x1FFE有效，0x1FFF无效
	uint8 canHeiLvlSign = SYN__u8HeiLvlSign(); // 0:正 1:负

	static uint16 lastValidValue = 0; // 0x0000~0x1FFE
	static uint8 lastValidSign = 0;   // 0:正 1:负
	static uint8 lastValidUnit = 1;   // 1:m
	static uint8 lostSignalCnt = 0;
	const uint8 TIMEOUT_CYCLE = 10;
	static int isFirst = 1;

	DIF__tstAltitudeDpoolData stDIFAltitudeDpool;

	// 2. 信号超时计数（此处假设有宏或外部变量判断CAN信号超时，若无则可补充）
	bool heiLvlTimeout = 0; // 需根据实际项目补充超时判断
	// 3. 判断是否用最后一次有效值
	bool useLastValue = false;
	if (heiLvlTimeout) {
		if (lostSignalCnt < TIMEOUT_CYCLE) lostSignalCnt++;
	} else {
		lostSignalCnt = 0;
	}
	if (lostSignalCnt >= TIMEOUT_CYCLE) {
		useLastValue = true;
	}

	// 4. 真值表映射
	if (!useLastValue && canHeiLvl == 0x0000) {
		// 0m，无符号
		stDIFAltitudeDpool.DIF_u16AltitudeValue = 0;
		stDIFAltitudeDpool.DIF_u8AltitudeSign = 0;
		stDIFAltitudeDpool.DIF_u8AltitudeUnit = 1;
		lastValidValue = 0;
		lastValidSign = 0;
		lastValidUnit = 1;
	} else if (!useLastValue && canHeiLvl >= 0x0001 && canHeiLvl <= 0x1FFE) {
		// 有效值，正负号
		stDIFAltitudeDpool.DIF_u16AltitudeValue = canHeiLvl;
		stDIFAltitudeDpool.DIF_u8AltitudeSign = canHeiLvlSign;
		stDIFAltitudeDpool.DIF_u8AltitudeUnit = 1;
		lastValidValue = canHeiLvl;
		lastValidSign = canHeiLvlSign;
		lastValidUnit = 1;
	} else if (!useLastValue && canHeiLvl == 0x1FFF) {
		// 无效值，显示上次有效值
		stDIFAltitudeDpool.DIF_u16AltitudeValue = lastValidValue;
		stDIFAltitudeDpool.DIF_u8AltitudeSign = lastValidSign;
		stDIFAltitudeDpool.DIF_u8AltitudeUnit = lastValidUnit;
	} else if (useLastValue) {
		// 超时，显示上次有效值
		stDIFAltitudeDpool.DIF_u16AltitudeValue = lastValidValue;
		stDIFAltitudeDpool.DIF_u8AltitudeSign = lastValidSign;
		stDIFAltitudeDpool.DIF_u8AltitudeUnit = lastValidUnit;
	} else if (isFirst) {
		// KL30 reset后，未收到有效信号，显示0
		stDIFAltitudeDpool.DIF_u16AltitudeValue = 0;
		stDIFAltitudeDpool.DIF_u8AltitudeSign = 0;
		stDIFAltitudeDpool.DIF_u8AltitudeUnit = 1;
		isFirst = 0;
	} else {
		// 其他情况，保持上次有效值
		stDIFAltitudeDpool.DIF_u16AltitudeValue = lastValidValue;
		stDIFAltitudeDpool.DIF_u8AltitudeSign = lastValidSign;
		stDIFAltitudeDpool.DIF_u8AltitudeUnit = lastValidUnit;
	}
	// 5. 写入DPOOL（假设有全局变量）
	// 这里仅作为示例，实际项目应写入全局DPOOL变量
	// DIF_stAltitudeDpoolData = stDIFAltitudeDpool;
}